package org.batatasframework.support.database.sql.where;

import java.util.List;

import org.batatasframework.support.database.LogicSymbol;
import org.batatasframework.support.database.metadatas.FieldMetadata;
import org.batatasframework.support.database.sql.QueryParameter;
import org.batatasframework.support.database.sql.TableInstance;

import cn.bonoon.kernel.util.Opt;

public class ArrayQueryFragment extends AbstractQueryFragment<Object[]>{

	public ArrayQueryFragment(TableInstance tableSource,
			FieldMetadata fieldMetadata, Opt opt, Object[] value) {
		super(tableSource, fieldMetadata, opt, value);
	}
	
	@Override
	public void parse(LogicSymbol logic, StringBuilder sql, List<QueryParameter> paramenters) throws Exception {
		
		if(null == value){
			/*
			 * 判断一下查询的参数值是否为空，如果为空，则不加这一个查询表达式；
			 * 应该由外部来确定查询的参数值不能为null的
			 */
			
			return;
		}
		
		/* 使用局部变量，可以改变值，不影响成员变量 */
		Opt opt = this.opt;
		if(value.length == 1){
			if(addParamenter(paramenters, value[0])){
			
				sql.append(logic.getValue());
			
				if(opt == Opt.NI || opt == Opt.NE){
					sql.append('(').append(columnName)
						.append(" is null or ").append(columnName)
						.append(Opt.NE.getOperator()).append(')');
				}else{
					if(opt == Opt.IN) opt = Opt.EQ;
					sql.append(columnName).append(Opt.EQ.getOperator());
				}
			}
			/*
			 * 如果使用的是数组查询，但只有一个参数，则应该使用对应的单参数的查询条件；
			 * 因为这里的参数条件只有"="或"<>"，所以只处理这两种方式即可
			 */
			return;
		}
		
		if(value.length > 1){
			sql.append(logic.getValue());
			if(opt == Opt.NI){
				sql.append('(').append(columnName).append(" is null or ").append(columnName).append(" not ");
				_in(sql, paramenters, value);
				sql.append(')');
			}else{
				_in(sql.append(columnName), paramenters, value);
			}
		}
		
		/*
		 * 这里还有可能是空数据，即：Ojbect[0]的对象
		 */
	}

	private void _in(StringBuilder sqlBuilder, List<QueryParameter> paramenters, Object[] value){
		
		String param = "";
		for(Object val : value){
			if(addParamenter(paramenters, val)){
				param += ",?";
			}
		}
		
		if(!param.isEmpty()){
			sqlBuilder.append(" in(").append(param.substring(1)).append(")");
		}
	}
}
